public class PrimeNumbers {
        public static void main(String[] args) {
            int limit = 20000;
            boolean[] isPrime = aiShiShai(limit);
            printPrimes(isPrime, limit);
        }

        //埃氏筛法来找出素数
        private static boolean[] aiShiShai(int limit) {
            boolean[] isPrime = new boolean[limit + 1];
            // 初始时将所有数标记为素数
            for (int i = 2; i <= limit; i++) {
                isPrime[i] = true;
            }
            // 核心
            for (int p = 2; p * p <= limit; p++) {
                if (isPrime[p]) {
                    for (int i = p * p; i <= limit; i += p) {
                        isPrime[i] = false;
                    }
                }
            }
            return isPrime;
        }

        // 打印素数，每行5个
        private static void printPrimes(boolean[] isPrime, int limit) {
            int count = 0;
            for (int i = 2; i <= limit; i++) {
                if (isPrime[i]) {
                    System.out.print(i + " ");
                    count++;
                    if (count % 5 == 0) {
                        System.out.println();
                    }
                }
            }
            if (count % 5 != 0) {
                System.out.println(); // 确保最后一行的换行
            }
        }
    }

分析最费时的函数
在这个程序中，aishishai()方法是最费时的。它的主要工作是标记哪些数字是素数。

1.初始化 isPrime 数组的时间复杂度是 O(n)。
2.筛法部分，内层循环将 isPrime 数组中的非素数标记为 false，这部分的时间复杂度是 O(n log log n)。

改进:

3.内存优化：可以进一步优化内存使用，例如只存储素数的结果，而不是使用一个大的布尔数组。